package com.timkj.zgyd.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author : liji
 * @date : 2020-09-02 00:10
 */
@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.timkj.zgyd.controller"))
                .paths(PathSelectors.any())
                .build();
    }


    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("中国移动 java 文档 v1.0.0")
                .description("Swagger2 文档")
                .termsOfServiceUrl("https://swagger.io/")
                .contact(new Contact("李纪","","liji@timkj.com"))
                .version("v1.0.0")
                .build();
    }

    /**
     * @Api
     * 用在接口文档的资源类上,用于标记当前类为Swagger的文档资源。其有属性：
     * · value ： 定义当前接口文档的名称
     * · description ： 用于定义当前接口文档的介绍
     * · tag ： 可以使用多个名称来定义文档，但若同时存在tag属性和value属性，则value属性会失效
     * · hidden ： 如果值为true，就会隐藏文档
     * @ApiOperation
     * 用在接口文档的方法上，主要用来注解接口。其中属性：
     * · value ： 对api的简短描述
     * · note : api的有关细节描述
     * · esponse : 接口返回类型（这里不是返回实际响应，而是返回对象的实际结果）
     * · hidden ： 如果只为true，就会在文档中隐藏
     * @ApiResponse、@ApiResponses
     * 二者配合使用返回http状态码，@ApiResponses的value值是@ApiResponse的集合，
     * 多个@ApiResponse用逗号隔开，@ApiResponse属性：
     * · code ： http状态码
     * · message ： http状态信息
     * · responseHeaders ： http响应头
     * @ApiParam
     * 用于方法的参数，其中属性：
     * · name ： 参数的名称
     * · value ： 参数值
     * · required ： 如果只为true，就是必传字段
     * · defaultValue ： 参数的默认值
     * · type ： 参数的类型
     * · hidden ： 如果值为true，就隐藏这个参数
     * @ApilmplicitParam、@ApilmplicitParams
     * @ApilmplicitParams的子集是@ApilmplicitParam注解，其中属性：
     * · name ： 参数的名称
     * · value ： 参数值
     * · required ： 如果值为true，就是必传字段
     * · defaultValue ： 参数的默认值
     * · dataType ： 数据类型
     * · hidden ： 如果值为true，就隐藏这个参数
     * · allowMultiple ： 是否允许重复
     * @ResponseHeader
     * api文档的响应头，其属性：
     * · name ： 响应头名称
     * · description ： 响应头备注
     * @ApiModel
     * 设置API响应的实体类，用作API返回对象。@ApiModel提供了以下几个参数
     * •　value：实体类名称。
     * •　description：实体类描述。
     * •　subTypes：子类的类型。
     * @ApiModelProperty
     * 设置API响应实体的属性，其中包含以下几个参数
     * •　name：属性名称。
     * •　value：属性值。
     * •　notes：属性的注释。
     * •　dataType：数据的类型。
     * •　required：如果值为true，就必须传入这个字段。
     * •　hidden：如果值为true，就隐藏这个字段。
     * •　readOnly：如果值为true，字段就是只读的。
     * •　allowEmptyValue：如果为true，就允许为空值。
     */
}
